Removed taxa not assigned to a phylum. After removing these taxa, 1 16S samples was removed due to having total counts <= 1500.

phyloseq-class experiment-level object
otu_table()   OTU Table:          [ 946 taxa and 48 samples ]:
sample_data() Sample Data:        [ 48 samples by 10 sample variables ]:
tax_table()   Taxonomy Table:     [ 946 taxa by 7 taxonomic ranks ]:
phy_tree()    Phylogenetic Tree:  [ 946 tips and 919 internal nodes ]:
taxa are rows
sample_data() Sample Data:        [ 50 samples by 9 sample variables ]:tax_table()   Taxonomy Table:     [ 246 taxa by 7 taxonomic ranks ]:
Fraction of ASVs classified at each rank
Taxonomic rank 16S ITS
Kingdom 1.00 1.00
Phylum 1.00 1.00
Class 1.00 0.99
Order 1.00 0.93
Family 0.99 0.89
Genus 0.91 0.86
Species 0.28 0.73




Rarefying to 1569 counts.

$`16S`

otu_table()   OTU Table:          [ 579 taxa and 48 samples ]:
sample_data() Sample Data:        [ 48 samples by 10 sample variables ]:




phyloseq-class experiment-level object
sample_data() Sample Data:        [ 50 samples by 9 sample variables ]:
phy_tree()    Phylogenetic Tree:  [ 111 tips and 109 internal nodes ]:taxa are rows







Predominant phyla

Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
Please use `reframe()` instead.
When switching from `summarise()` to `reframe()`, remember that `reframe()` always returns an ungrouped data frame and adjust accordingly.Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
Please use `reframe()` instead.
When switching from `summarise()` to `reframe()`, remember that `reframe()` always returns an ungrouped data frame and adjust accordingly.
Phylum Total Relative Abundance Relative abundance B73 Relative abundance CML322
Proteobacteria 0.866 0.829 0.899
Firmicutes 0.065 0.118 0.016
Actinobacteriota 0.038 0.041 0.035
Bacteroidota 0.030 0.010 0.050
Phylum Total Relative Abundance Relative abundance B73 Relative abundance CML322
Ascomycota 0.999 0.999 0.999
Basidiomycota 0.001 0.001 0.001




Removed taxa that are present in less than 5% of samples for ASV level dataset. This will be used for differential abundance testing at ASV level.

$`16S`
phyloseq-class experiment-level object
otu_table()   OTU Table:          [ 287 taxa and 48 samples ]:
sample_data() Sample Data:        [ 48 samples by 10 sample variables ]:
tax_table()   Taxonomy Table:     [ 287 taxa by 7 taxonomic ranks ]:phy_tree()    Phylogenetic Tree:  [ 287 tips and 278 internal nodes ]:taxa are rows$ITS

otu_table()   OTU Table:          [ 51 taxa and 50 samples ]:sample_data() Sample Data:        [ 50 samples by 9 sample variables ]:
tax_table()   Taxonomy Table:     [ 51 taxa by 7 taxonomic ranks ]:phy_tree()    Phylogenetic Tree:  [ 51 tips and 50 internal nodes ]:taxa are rows




Agglomerated counts at both genus level and species level.

Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
Please use `reframe()` instead.
When switching from `summarise()` to `reframe()`, remember that `reframe()` always returns an ungrouped data frame and adjust accordingly.Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
Please use `reframe()` instead.
When switching from `summarise()` to `reframe()`, remember that `reframe()` always returns an ungrouped data frame and adjust accordingly.Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
Please use `reframe()` instead.
When switching from `summarise()` to `reframe()`, remember that `reframe()` always returns an ungrouped data frame and adjust accordingly.Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
Please use `reframe()` instead.
When switching from `summarise()` to `reframe()`, remember that `reframe()` always returns an ungrouped data frame and adjust accordingly.

Most prevalent genera

Genus Total Relative Abundance Relative abundance B73 Relative abundance CML322
Pantoea 0.461 0.419 0.500
Klebsiella 0.094 0.024 0.159
Enterobacter 0.051 0.101 0.005
Carnimonas 0.041 0.085 0.000
Burkholderia-Caballeronia-Paraburkholderia 0.030 0.048 0.013
Serratia 0.029 0.033 0.026
Stenotrophomonas 0.029 0.014 0.043
Lactococcus 0.024 0.048 0.003
Sphingobacterium 0.024 0.007 0.039
Achromobacter 0.023 0.008 0.036
Rosenbergiella 0.022 0.047 0.000
Listeria 0.019 0.040 0.000
Allorhizobium-Neorhizobium-Pararhizobium-Rhizobium 0.017 0.009 0.023
Ochrobactrum 0.017 0.013 0.020
Enterococcus 0.010 0.013 0.007
Genus Total Relative Abundance Relative abundance B73 Relative abundance CML322
Aspergillus 0.552 0.497 0.608
Sarocladium 0.252 0.226 0.279
Meyerozyma 0.124 0.148 0.101
Talaromyces 0.040 0.076 0.003
Trichoderma 0.013 0.026 0.001
Penicillium 0.006 0.011 0.001
Curvularia 0.005 0.007 0.003
Alternaria 0.004 0.007 0.002
Ramichloridium 0.001 0.001 0.001
Acremonium 0.000 0.001 0.000
Bipolaris 0.000 0.000 0.000
Candida 0.000 0.000 0.000
Ceriporia 0.000 0.000 0.000
Cladosporium 0.000 0.000 0.000
Cyphellophora 0.000 0.000 0.000
Exserohilum 0.000 0.000 0.000
Fomes 0.000 0.000 0.000
Fusarium 0.000 0.000 0.000
Lecanicillium 0.000 0.000 0.000
Moesziomyces 0.000 0.000 0.000
Myrothecium 0.000 0.001 0.000
Paraconiothyrium 0.000 0.000 0.000
Peniophora 0.000 0.000 0.000
Peziza 0.000 0.001 0.000
Phanerochaete 0.000 0.000 0.000
Phlebia 0.000 0.000 0.000
Pyricularia 0.000 0.000 0.000
Scopuloides 0.000 0.000 0.000
Stereum 0.000 0.001 0.000
Tinctoporellus 0.000 0.000 0.000
Trametes 0.000 0.000 0.000
unidentified 0.000 0.000 0.000

Most prevalent species

Species Total Relative Abundance Relative abundance B73 Relative abundance CML322
Pantoea_ananatis 0.193 0.207 0.173
Burkholderia_gladioli 0.152 0.195 0.091
Listeria_grayi 0.070 0.119 0.000
Lactococcus_lactis 0.068 0.077 0.056
Sphingobacterium_siyangense 0.050 0.001 0.120
Lactococcus_garvieae 0.043 0.073 0.000
Sphingobacterium_thalpophilum 0.032 0.000 0.079
Sphingomonas_phyllosphaerae 0.030 0.000 0.073
Acinetobacter_baumannii 0.029 0.000 0.070
Pseudomonas_psychrotolerans 0.026 0.008 0.052
Comamonas_sediminis 0.023 0.000 0.056
Corynebacterium_kroppenstedtii 0.021 0.036 0.000
Flavobacterium_anatoliense 0.019 0.000 0.047
Sphingobacterium_multivorum 0.015 0.012 0.019
Staphylococcus_sciuri 0.015 0.026 0.000
Devosia_riboflavina 0.014 0.000 0.035
uncultured_Tistrella 0.013 0.023 0.000
uncultured_bacterium 0.010 0.014 0.003
Species Total Relative Abundance Relative abundance B73 Relative abundance CML322
Aspergillus_flavus 0.567 0.525 0.608
Sarocladium_zeae 0.259 0.234 0.284
Meyerozyma_caribbica 0.135 0.168 0.102
Aspergillus_niger 0.011 0.021 0.000
Talaromyces_purpureogenus 0.010 0.019 0.000

Below are barplots of relative taxon abundances for 16S sequencing with samples grouped according to similarity using the neatmap method.

[[1]]

[[2]]

[[3]]

[[4]]

[[5]]
NA







The next two sets are done with ITS counts but made the same way as above.

Warning: stress is (nearly) zero: you may have insufficient data
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]
NA







LS0tDQp0aXRsZTogIjE2UyBhbmQgSVRTIGRhdGEgaW1wb3J0Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICBlZGl0b3Jfb3B0aW9uczogDQogICAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHFpaW1lMlIpDQpsaWJyYXJ5KGdnZWFzeSkNCmxpYnJhcnkocGh5bG9zZXEpDQpsaWJyYXJ5KEJpb3N0cmluZ3MpDQpsaWJyYXJ5KGdnc2lnbmlmKQ0KbGlicmFyeShnZ2Vhc3kpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KERFU2VxMikNCmxpYnJhcnkoQUxERXgyKQ0KbGlicmFyeShtaWNyb2Jpb21lKSANCmxpYnJhcnkodmVnYW4pDQpsaWJyYXJ5KEFOQ09NQkMpDQpsaWJyYXJ5KGdsdWUpDQpsaWJyYXJ5KGdnc3RhdHNwbG90KQ0KbGlicmFyeShiZWVzd2FybSkNCmxpYnJhcnkobXNhKQ0KbGlicmFyeShoZXJlKQ0KbGlicmFyeShnZ3RleHQpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHRpZHlIZWF0bWFwKQ0KbGlicmFyeShTcGllY0Vhc2kpDQpsaWJyYXJ5KE5ldENvTWkpDQpsaWJyYXJ5KGlncmFwaCkNCmxpYnJhcnkodGlkeWdyYXBoKQ0KbGlicmFyeShnZ3JhcGgpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucmV0aW5hID0gMSwgZHBpPTQ1MCkNCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybT1GKQ0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQpzZXNzaW9uSW5mbygpICU+JQ0KICBjYXB0dXJlLm91dHB1dChzZXNzaW9uSW5mbygpKSAlPiUNCiAgd3JpdGVfbGluZXMoaGVyZSgnb3V0cHV0L3Nlc3Npb25faW5mby50eHQnKSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQptZXRhZGF0YSA9IHJlYWRfdHN2KGhlcmUoJ2RhdGEnLCAnbWV0YWRhdGFfbWVyZ2VkLnRzdicpLCBjb2xfdHlwZXMgPSBjb2xzKCkpICU+JQ0KICByZW5hbWUoVGltZVBvaW50ID0gVGltZXBvaW50KSAlPiUNCiAgbXV0YXRlKFRpbWVQb2ludCA9IHN0cl9yZXBsYWNlKFRpbWVQb2ludCwgJ14nLCAnVCcpLA0KICAgICAgICAgY29uZGl0aW9uID0gc3RyX2MoQ29yblZhcmlldHksIEZ1bmdhbFN0cmFpbiwgVGlzc3VlRXh0cmFjdGlvbiwgc2VwPSdfJykpICU+JQ0KICByZW5hbWUoQ29ybl9HZW5vdHlwZSA9IENvcm5WYXJpZXR5LCBGdW5nYWxfVHJlYXRtZW50ID0gRnVuZ2FsU3RyYWluLCBUaXNzdWVfRXh0cmFjdGlvbiA9IFRpc3N1ZUV4dHJhY3Rpb24pDQpgYGANCg0KYGBge3J9DQpnZXRfY291bnRzID0gZnVuY3Rpb24oLikgb3R1X3RhYmxlKC4pICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbignZmVhdHVyZV9pZCcpICU+JSBhc190aWJibGUoKQ0KZ2V0X3RheCA9IGZ1bmN0aW9uKC4pIHRheF90YWJsZSguKSAlPiUgZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ2ZlYXR1cmVfaWQnKSAlPiUgYXNfdGliYmxlKCkNCmdldF9xemEgPSBmdW5jdGlvbihmaWxlcGF0aCl7cmVhZF9xemEoZmlsZXBhdGgpJGRhdGEgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCdTYW1wbGVJRCcpfQ0KZ2V0X3NhbXBsZV9kYXRhID0gZnVuY3Rpb24oLikgZGF0YS5mcmFtZShzYW1wbGVfZGF0YSguKSkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbignU2FtcGxlSUQnKSAlPiUgYXNfdGliYmxlKCkNCmNoYW5nZV9pdHNfaWRzX3RvX21hdGNoXzE2UyA9IC4gJT4lIA0KICBtdXRhdGUoU2FtcGxlSUQgPSBzdHJfcmVwbGFjZShTYW1wbGVJRCwgJyguKj8pLSguKiknLCAnXFwyLVxcMScpLA0KICAgICAgICAgU2FtcGxlSUQgPSBzdHJfcmVwbGFjZV9hbGwoU2FtcGxlSUQsIGMoJy1CNzMnPSctMzczJywgJy1DMzIyJz0nLTMyMicpKSkNCmNoYW5nZV8xNlNfaWRzX3RvX21hdGNoX0lUUyA9IC4gJT4lIA0KICBtdXRhdGUoU2FtcGxlSUQgPSBzdHJfcmVwbGFjZShTYW1wbGVJRCwgJyguKj8pLSguKiknLCAnXFwyLVxcMScpLA0KICAgICAgICAgU2FtcGxlSUQgPSBzdHJfcmVwbGFjZV9hbGwoU2FtcGxlSUQsIGMoJy0zNzMnPSctQjczJywgJy0zMjInPSctQzMyMicpKSkNCmBgYA0KDQpgYGB7cn0NCnBzID0gbGlzdCgnMTZTJz0gcXphX3RvX3BoeWxvc2VxKGZlYXR1cmVzID0gaGVyZSgnZGF0YScsICcxNlMnLCAndGFibGVfd29fb3V0bGllcnMucXphJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWU9aGVyZSgnZGF0YScsICcxNlMnLCAncm9vdGVkLXRyZWUucXphJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRheG9ub215PWhlcmUoJ2RhdGEnLCAnMTZTJywgJ21lcmdlZC10YXhvbm9teS5xemEnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE9aGVyZSgnZGF0YScsICcxNlMnLCAnbWV0YWRhdGFfZmlsdGVyZWQudHN2JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRtcD0nQzovVXNlcnMvYnJpYW4ubWFjay9Eb3dubG9hZHMvdG1wJykgJT4lIA0KICAgICAgICAgICAgc3Vic2V0X3NhbXBsZXMoQ29yblZhcmlldHkgIT0gJ2R1bW15JyAmIFRpbWVwb2ludCA9PSAnMicgJiBUaXNzdWVUeXBlID09ICdPdnVsZScpICU+JQ0KICAgICAgICAgICAgcHJ1bmVfdGF4YSh0YXhhX3N1bXMoLikgPiAwLCAuKSwNCiAgICAgICAgICAnSVRTJyA9IHF6YV90b19waHlsb3NlcShmZWF0dXJlcyA9IGhlcmUoJ2RhdGEnLCAnSVRTJywgJ3RhYmxlLW5vLW1pdG9jaG9uZHJpYS1uby1jaGxvcm9wbGFzdC5xemEnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZT1oZXJlKCdkYXRhJywgJ0lUUycsICdyb290ZWQtdHJlZS5xemEnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGF4b25vbXk9aGVyZSgnZGF0YScsICdJVFMnLCAnbWVyZ2VkLXRheG9ub215LnF6YScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YT1oZXJlKCdkYXRhJywgJ0lUUycsICdtZXRhZGF0YV9tZXJnZWQudHN2JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRtcD0nQzovVXNlcnMvYnJpYW4ubWFjay9Eb3dubG9hZHMvdG1wJykgICU+JSANCiAgICAgICAgICAgIHN1YnNldF9zYW1wbGVzKENvcm5WYXJpZXR5ICAhPSAnZHVtbXknICYgVGltZXBvaW50ID09ICcyJyAmIFRpc3N1ZVR5cGUgPT0gJ092dWxlJykgJT4lDQogICAgICAgICAgICBwcnVuZV90YXhhKHRheGFfc3VtcyguKSA+IDAsIC4pDQogICAgICAgICAgICApDQpwcyA9IG1hcChwcywgZnVuY3Rpb24oLngpew0KICBzYW1wbGVfZGF0YSgueCkgPSBnZXRfc2FtcGxlX2RhdGEoLngpICU+JSANCiAgICByZW5hbWUoVGltZVBvaW50ID0gVGltZXBvaW50KSAlPiUNCiAgICBtdXRhdGUoVGltZVBvaW50ID0gc3RyX3JlcGxhY2UoVGltZVBvaW50LCAnXicsICdUJyksDQogICAgICAgICAgIGNvbmRpdGlvbiA9IHN0cl9jKENvcm5WYXJpZXR5LCBGdW5nYWxTdHJhaW4sIFRpc3N1ZUV4dHJhY3Rpb24sIHNlcD0nXycpKSAlPiUNCiAgICByZW5hbWUoQ29ybl9HZW5vdHlwZSA9IENvcm5WYXJpZXR5LCBGdW5nYWxfVHJlYXRtZW50ID0gRnVuZ2FsU3RyYWluLCBUaXNzdWVfRXh0cmFjdGlvbiA9IFRpc3N1ZUV4dHJhY3Rpb24pICU+JQ0KICAgIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lDQogICAgbXV0YXRlKGJpb2xvZ2ljYWxfcmVwID0gcm93X251bWJlcigpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgbXV0YXRlKGNvbmRpdGlvbl93X3JlcCA9IHN0cl9jKGNvbmRpdGlvbiwgYmlvbG9naWNhbF9yZXAsIHNlcD0nXycpKSAlPiUNCiAgICBjb2x1bW5fdG9fcm93bmFtZXMoJ1NhbXBsZUlEJykNCiAgcmV0dXJuKC54KX0pDQpzYW1wbGVfZGF0YShwcyRJVFMpID0gZ2V0X3NhbXBsZV9kYXRhKHBzJElUUykgJT4lDQogIGNoYW5nZV9pdHNfaWRzX3RvX21hdGNoXzE2UygpICU+JQ0KICBjb2x1bW5fdG9fcm93bmFtZXMoJ1NhbXBsZUlEJykNCmBgYA0KDQpSZW1vdmVkIHRheGEgbm90IGFzc2lnbmVkIHRvIGEgcGh5bHVtLiBBZnRlciByZW1vdmluZyB0aGVzZSB0YXhhLCAxIDE2UyBzYW1wbGVzIHdhcyByZW1vdmVkIGR1ZSB0byBoYXZpbmcgdG90YWwgY291bnRzIDw9IDE1MDAuDQoNCmBgYHtyfQ0KcHNfcGh5bHVtX2ZpbHQgPSBsaXN0KCcxNlMnID0gc3Vic2V0X3RheGEocHMkYDE2U2AsICFpcy5uYShQaHlsdW0pICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFQaHlsdW0gJWluJSBjKCcnLCAndW5jaGFyYWN0ZXJpemVkJywgJ3VuaWRlbnRpZmllZCcpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFLaW5nZG9tICVpbiUgYygnZF9fRXVrYXJ5b3RhJykpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgIHBydW5lX3NhbXBsZXMoc2FtcGxlX3N1bXMoLikgPj0gMTUwMCwgLikgJT4lIHBydW5lX3RheGEodGF4YV9zdW1zKC4pID4gMCwgLiksDQogICAgICAgICAgICAgICAgICAgICAgJ0lUUycgPSBzdWJzZXRfdGF4YShwcyRJVFMsICFpcy5uYShQaHlsdW0pICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVBoeWx1bSAlaW4lIGMoIiIsICd1bmNoYXJhY3Rlcml6ZWQnLCAndW5pZGVudGlmaWVkJykpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgIHBydW5lX3NhbXBsZXMoc2FtcGxlX3N1bXMoLikgPj0gMTUwMCwgLikgJT4lIHBydW5lX3RheGEodGF4YV9zdW1zKC4pID4gMCwgLikpDQpwc19waHlsdW1fZmlsdF90YXggPSBwc19waHlsdW1fZmlsdCAlPiUgbWFwKGdldF90YXgpDQpwc19waHlsdW1fZmlsdF9jb3VudHMgPSBwc19waHlsdW1fZmlsdCAlPiUgbWFwKGdldF9jb3VudHMpDQpwc19waHlsdW1fZmlsdF9yYSA9IG1hcChwc19waHlsdW1fZmlsdCwgfnRyYW5zZm9ybV9zYW1wbGVfY291bnRzKC54LCBmdW5jdGlvbih4KXt4IC8gc3VtKHgpfSkpDQpwc19waHlsdW1fZmlsdA0KYGBgDQpgYGB7cn0NCnBzX3BoeWx1bV9maWx0ICU+JSBpbWFwKGZ1bmN0aW9uKHBzX3BoeWx1bV9maWx0LCBzZXFfdHlwZSl7DQogIHBzX3BoeWx1bV9maWx0ICU+JSBnZXRfdGF4KCkgJT4lDQogICAgc3VtbWFyaXplKGFjcm9zcygtZmVhdHVyZV9pZCwgfnN1bSghaXMubmEoLngpKS8gbigpKSkgJT4lDQogICAgcm91bmQoMikgJT4lDQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnVGF4b25vbWljIHJhbmsnLCB2YWx1ZXNfdG8gPSBzZXFfdHlwZSkNCiAgfSkgJT4lDQogIHJlZHVjZShmdWxsX2pvaW4sIGJ5PSdUYXhvbm9taWMgcmFuaycpICU+JQ0KICBrYmwoZm9ybWF0ID0gJ2h0bWwnLCBjYXB0aW9uPSdGcmFjdGlvbiBvZiBBU1ZzIGNsYXNzaWZpZWQgYXQgZWFjaCByYW5rJykgJT4lDQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJUaW1lcyBOZXcgUm9tYW4iKSANCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD02fQ0KcHNfcGh5bHVtX2ZpbHQgJT4lIGltYXAoZnVuY3Rpb24ocHNfcGh5bHVtX2ZpbHQsIHNlcV90eXBlKXsNCiAgcHNfcGh5bHVtX2ZpbHQgJT4lIHNhbXBsZV9zdW1zKCkgJT4lIGVuZnJhbWUobmFtZSA9ICdTYW1wbGVJRCcsIHZhbHVlID0gJ3RvdGFsX2NvdW50cycpICU+JQ0KICAgIGxlZnRfam9pbihtZXRhZGF0YSwgYnk9J1NhbXBsZUlEJykgJT4lDQogICAgbXV0YXRlKHNlcV90eXBlID0gc2VxX3R5cGUpDQogIH0pICU+JQ0KICBiaW5kX3Jvd3MoKSAlPiUNCiAgZ2dwbG90KGFlcyh4PWNvbmRpdGlvbiwgeT10b3RhbF9jb3VudHMpKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsNCiAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuMywgd2lkdGg9MC4yLCBncm91cE9uWD1UUlVFKSArDQogIGZhY2V0X3dyYXAofnNlcV90eXBlLCBuY29sPTEsIHNjYWxlcyA9ICdmcmVlJykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSkgKw0KICBsYWJzKHRpdGxlPSdUb3RhbCBudW1iZXIgb2YgY291bnRzIGZvciBlYWNoIHNhbXBsZScpICsNCiAgZ2dlYXN5OjplYXN5X3JvdGF0ZV94X2xhYmVscygpICsNCiAgZ2dlYXN5OjplYXN5X2NlbnRlcl90aXRsZSgpDQpgYGANCg0KPGJyPjxicj48YnI+DQoNClJhcmVmeWluZyB0byAxNTY5IGNvdW50cy4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpwc19waHlsdW1fZmlsdF9yYXJlZmllZCA9ICBwc19waHlsdW1fZmlsdCAlPiUgbWFwKA0KICB+cmFyZWZ5X2V2ZW5fZGVwdGgoLngsIHNhbXBsZS5zaXplID0gMTU2OSwgcm5nc2VlZD0xMTAwICwgcmVwbGFjZT1GQUxTRSkgJT4lDQogICAgIHBydW5lX3RheGEodGF4YV9zdW1zKC4pID4gMCwgLikpDQpwc19waHlsdW1fZmlsdF9yYXJlZmllZA0KYGBgDQoNCjxicj48YnI+PGJyPjxicj48YnI+PGJyPg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyfQ0KcHJldiA9IG1hcChwc19waHlsdW1fZmlsdF9yYSwNCiAgICAgICAgICAgIGZ1bmN0aW9uKHBzX3BoeWx1bV9maWx0X3JhKXsNCiAgICAgICAgICAgICAgcmVsYXRpdmVfY291bnRzID0gcHNfcGh5bHVtX2ZpbHRfcmEgJT4lIGdldF9jb3VudHMoKQ0KICAgICAgICAgICAgICB0YXggPSBwc19waHlsdW1fZmlsdF9yYSAlPiUgZ2V0X3RheCgpDQogICAgICAgICAgICAgIHJlbGF0aXZlX2NvdW50cyAlPiUgDQogICAgICAgICAgICAgICAgcmVmcmFtZShmZWF0dXJlX2lkID0gZmVhdHVyZV9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlID0gcm93U3VtcyguPiAwKSAtMSwgI3N1YnRyYWN0ZWQgMSBiZWNhdXNlIGZlYXR1cmVfaWQgY29sdW1uIGlzIGFsd2F5cyBjb3VudGVkDQogICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfcmVsYXRpdmVfYWJ1bmRhbmNlID0gdGF4YV9zdW1zKHBzX3BoeWx1bV9maWx0X3JhKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgUGh5bHVtID0gdGF4JFBoeWx1bSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBHZW51cyA9IHRheCRHZW51cywNCiAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID0gdGF4JFNwZWNpZXMpfSkNCnByZXZfcGxvdHMgPSBwcmV2ICU+JSBpbWFwKGZ1bmN0aW9uKHByZXYsIHNlcV90eXBlKXsNCiAgcHJldiAlPiUgDQogICAgbXV0YXRlKHByZXZhbGVuY2UgPSBwcmV2YWxlbmNlIC8gbnNhbXBsZXMocHNfcGh5bHVtX2ZpbHRbW3NlcV90eXBlXV0pKSAlPiUNCiAgZ2dwbG90KGFlcyh0b3RhbF9yZWxhdGl2ZV9hYnVuZGFuY2UsIHByZXZhbGVuY2UsIGNvbG9yPVBoeWx1bSwgdGV4dD1nbHVlKCdHZW51czoge0dlbnVzfTxicj5TcGVjaWVzOiB7U3BlY2llc30nKSkpICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjA1LCBhbHBoYSA9IDAuNSwgbGluZXR5cGUgPSAyKSArIA0KICAgIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gMC42KSArDQogICAgc2NhbGVfeF9sb2cxMCgpICsgeGxhYigiVG90YWwgUmVsYXRpdmUgQWJ1bmRhbmNlIikgKyB5bGFiKCJQcmV2YWxlbmNlIFtGcmFjdGlvbiBTYW1wbGVzXSIpICsNCiAgICBmYWNldF93cmFwKH5QaHlsdW0pICsNCiAgICBsYWJzKHRpdGxlID0gZ2x1ZSgne3NlcV90eXBlfSBBU1YgUHJldmFsZW5jZScpKSArDQogICAgdGhlbWVfZ3JheSgpICsNCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpfSkNCmBgYA0KDQpgYGB7ciwgb3V0LndpZHRoPTEyfQ0KcHJldl9wbG90cyRgMTZTYCAlPiUgcGxvdGx5OjpnZ3Bsb3RseSgpDQpgYGANCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NH0NCnByZXZfcGxvdHMkSVRTICU+JSBwbG90bHk6OmdncGxvdGx5KCkNCmBgYA0KUHJlZG9taW5hbnQgcGh5bGENCmBgYHtyfQ0KcHNfcGh5bGEgPSBtYXAocHNfcGh5bHVtX2ZpbHQsIA0KICAgICAgICAgICAgICAgZnVuY3Rpb24ocHNfcGh5bHVtX2ZpbHQpew0KICAgICAgICAgICAgICAgICBwc19waHlsYSA9IHRheF9nbG9tKHBzX3BoeWx1bV9maWx0LCAiUGh5bHVtIiwgTkFybSA9IFRSVUUpDQogICAgICAgICAgICAgICAgIHByZXZhbGVuY2VUaHJlc2hvbGQgPSAgMC4wNSAqIG5zYW1wbGVzKHBzX3BoeWxhKQ0KICAgICAgICAgICAgICAgICBwc19waHlsYSA9IHBzX3BoeWxhICU+JSANCiAgICAgICAgICAgICAgICAgICBnZXRfY291bnRzKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShmZWF0dXJlX2lkID0gZmVhdHVyZV9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZSA9IHJvd1N1bXMoLj4gMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsQWJ1bmRhbmNlID0gdGF4YV9zdW1zKHBzX3BoeWxhKSkgJT4lDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKHByZXZhbGVuY2UgPj0gcHJldmFsZW5jZVRocmVzaG9sZCkgJT4lIA0KICAgICAgICAgICAgICAgICAgIHB1bGwoZmVhdHVyZV9pZCkgJT4lDQogICAgICAgICAgICAgICAgICAgcHJ1bmVfdGF4YSguLCBwc19waHlsYSkgJT4lDQogICAgICAgICAgICAgICAgICAgcHJ1bmVfc2FtcGxlcyhzYW1wbGVfc3VtcyguKSA+PSA1MDAsIC4pICU+JSANCiAgICAgICAgICAgICAgICAgICBwcnVuZV90YXhhKHRheGFfc3VtcyguKSA+IDAsIC4pDQogICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhKHBzX3BoeWxhKSA9IHNhbXBsZV9kYXRhKHBzX3BoeWxhKSAlPiUgDQogICAgICAgICAgICAgICAgICAgYXMoJ2RhdGEuZnJhbWUnKSAlPiUNCiAgICAgICAgICAgICAgICAgICBtdXRhdGUoVGlzc3VlVHlwZSA9IGZjdF9yZWxldmVsKFRpc3N1ZVR5cGUsICdPdnVsZScpKQ0KICAgICAgICAgICAgICAgICByZXR1cm4ocHNfcGh5bGEpfSkNCnBzX3BoeWxhX3JhID0gbWFwKHBzX3BoeWxhLCB+dHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoLngsIGZ1bmN0aW9uKHgpe3ggLyBzdW0oeCl9KSkNCnByZXZfY29ybl9waHlsYSA9IG1hcChwc19waHlsYV9yYSwNCiAgICAgICAgICAgIGZ1bmN0aW9uKHBzX3BoeWxhX3JhKXsNCiAgICAgICAgICAgIHJlbGF0aXZlX2NvdW50cyA9IHBzX3BoeWxhX3JhICU+JSBnZXRfY291bnRzKCkNCiAgICAgICAgICAgICAgdGF4ID0gcHNfcGh5bGFfcmEgJT4lIGdldF90YXgoKQ0KICAgICAgICAgICAgICByZWxhdGl2ZV9jb3VudHMgJT4lIA0KICAgICAgICAgICAgICAgIHBpdm90X2xvbmdlcigtZmVhdHVyZV9pZCwgbmFtZXNfdG8gPSAnU2FtcGxlSUQnLCB2YWx1ZXNfdG8gPSAnY291bnRzJykgJT4lDQogICAgICAgICAgICAgICAgbGVmdF9qb2luKG1ldGFkYXRhLCBieT0nU2FtcGxlSUQnKSAlPiUNCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4odGF4LCBieT0nZmVhdHVyZV9pZCcpICU+JQ0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KFBoeWx1bSkgJT4lDQogICAgICAgICAgICAgICAgbXV0YXRlKHByZXZhbGVuY2VfZW50aXJlX2RhdGFzZXQgPSBzdW0oY291bnRzID4gMCkgLyBuKCksDQogICAgICAgICAgICAgICAgICAgICAgIG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlX2VudGlyZV9kYXRhc2V0ID0gbWVhbihjb3VudHMpKSAlPiUNCiAgICAgICAgICAgICAgICBncm91cF9ieShQaHlsdW0sIENvcm5fR2Vub3R5cGUpICU+JQ0KICAgICAgICAgICAgICAgIHN1bW1hcml6ZShwcmV2YWxlbmNlID0gc3VtKGNvdW50cyA+IDApIC8gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZSA9IG1lYW4oY291bnRzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9lbnRpcmVfZGF0YXNldCA9IGZpcnN0KHByZXZhbGVuY2VfZW50aXJlX2RhdGFzZXQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZV9lbnRpcmVfZGF0YXNldCA9IGZpcnN0KG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlX2VudGlyZV9kYXRhc2V0KSkgJT4lDQogICAgICAgICAgICAgICAgdW5ncm91cCgpfSkNCnByZXZfY29ybl9waHlsYSRgMTZTYCAlPiUgDQogIHJlbmFtZSh0b3RhbCA9IG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlX2VudGlyZV9kYXRhc2V0KSAlPiUNCiAgZGlzdGluY3QoUGh5bHVtLCBDb3JuX0dlbm90eXBlLCBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZSwgdG90YWwpICU+JQ0KICBtdXRhdGUobWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2U9IHJvdW5kKG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlLCAzKSwNCiAgICAgICAgIHRvdGFsID0gcm91bmQodG90YWwsIDMpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IENvcm5fR2Vub3R5cGUsIHZhbHVlc19mcm9tID0gbWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2UpICU+JQ0KICBmaWx0ZXIodG90YWwgPj0gMC4wMSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JQ0KICBrYmwoZm9ybWF0ID0gJ2h0bWwnLCBjb2wubmFtZXMgPSBjKCdQaHlsdW0nLCAnVG90YWwgUmVsYXRpdmUgQWJ1bmRhbmNlJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlbGF0aXZlIGFidW5kYW5jZSBCNzMnLCAnUmVsYXRpdmUgYWJ1bmRhbmNlIENNTDMyMicpKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIlRpbWVzIE5ldyBSb21hbiIpDQpwcmV2X2Nvcm5fcGh5bGEkSVRTICU+JSANCiAgcmVuYW1lKHRvdGFsID0gbWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2VfZW50aXJlX2RhdGFzZXQpICU+JQ0KICBkaXN0aW5jdChQaHlsdW0sIENvcm5fR2Vub3R5cGUsIG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlLCB0b3RhbCkgJT4lDQogIG11dGF0ZShtZWFuX3JlbGF0aXZlX2FidW5kYW5jZT0gcm91bmQobWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2UsIDMpLA0KICAgICAgICAgdG90YWwgPSByb3VuZCh0b3RhbCwgMykpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gQ29ybl9HZW5vdHlwZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZSkgJT4lDQogICNmaWx0ZXIodG90YWwgPj0gMC4wMSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JQ0KICBrYmwoZm9ybWF0ID0gJ2h0bWwnLCBjb2wubmFtZXMgPSBjKCdQaHlsdW0nLCAnVG90YWwgUmVsYXRpdmUgQWJ1bmRhbmNlJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlbGF0aXZlIGFidW5kYW5jZSBCNzMnLCAnUmVsYXRpdmUgYWJ1bmRhbmNlIENNTDMyMicpKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIlRpbWVzIE5ldyBSb21hbiIpDQpgYGANCjxicj48YnI+PGJyPiBSZW1vdmVkIHRheGEgdGhhdCBhcmUgcHJlc2VudCBpbiBsZXNzIHRoYW4gNSUgb2Ygc2FtcGxlcyBmb3IgQVNWIGxldmVsIGRhdGFzZXQuIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBkaWZmZXJlbnRpYWwgYWJ1bmRhbmNlIHRlc3RpbmcgYXQgQVNWIGxldmVsLg0KYGBge3J9DQpwc19wcmV2ZiA9IG1hcDIocHNfcGh5bHVtX2ZpbHQsIHByZXYsDQogICAgICAgICAgICAgICBmdW5jdGlvbihwc19waHlsdW1fZmlsdCwgcHJldil7DQogICAgICAgICAgICAgICAgIHByZXZhbGVuY2VUaHJlc2hvbGQgPSAgMC4wNSAqIG5zYW1wbGVzKHBzX3BoeWx1bV9maWx0KQ0KICAgICAgICAgICAgICAgICBrZWVwVGF4YSA9IGZpbHRlcihwcmV2LCBwcmV2YWxlbmNlID49IHByZXZhbGVuY2VUaHJlc2hvbGQpICU+JSANCiAgICAgICAgICAgICAgICAgICBwdWxsKGZlYXR1cmVfaWQpDQogICAgICAgICAgICAgICAgIHBydW5lX3RheGEoa2VlcFRheGEsIHBzX3BoeWx1bV9maWx0KSAlPiUNCiAgICAgICAgICAgICAgICAgICBwcnVuZV9zYW1wbGVzKHNhbXBsZV9zdW1zKC4pID49IDUwMCwgLikgJT4lIA0KICAgICAgICAgICAgICAgICAgIHBydW5lX3RheGEodGF4YV9zdW1zKC4pID4gMCwgLil9KQ0KcHNfcHJldmZfcmEgPSBtYXAocHNfcHJldmYsIH50cmFuc2Zvcm1fc2FtcGxlX2NvdW50cygueCwgZnVuY3Rpb24oeCl7eCAvIHN1bSh4KX0pKQ0KcHNfcHJldmZfY2xyID0gbWFwKHBzX3ByZXZmLCBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0sICdjbHInKQ0KcHNfcHJldmZfYWxyID0gbWFwKHBzX3ByZXZmLCBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0sICdhbHInLCBzaGlmdD0xKQ0KcHNfcHJldmYNCmBgYA0KDQo8YnI+PGJyPjxicj4gQWdnbG9tZXJhdGVkIGNvdW50cyBhdCBib3RoIGdlbnVzIGxldmVsIGFuZCBzcGVjaWVzIGxldmVsLg0KDQpgYGB7cn0NCnBzX2dlbnVzID0gbWFwKHBzX3BoeWx1bV9maWx0LCANCiAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBzX3BoeWx1bV9maWx0KXsNCiAgICAgICAgICAgICAgICAgcHNfZ2VudXMgPSB0YXhfZ2xvbShwc19waHlsdW1fZmlsdCwgIkdlbnVzIiwgTkFybSA9IFRSVUUpDQogICAgICAgICAgICAgICAgIHByZXZhbGVuY2VUaHJlc2hvbGQgPSAgMC4wNSAqIG5zYW1wbGVzKHBzX2dlbnVzKQ0KICAgICAgICAgICAgICAgICBwc19nZW51cyA9IHBzX2dlbnVzICU+JSANCiAgICAgICAgICAgICAgICAgICBnZXRfY291bnRzKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShmZWF0dXJlX2lkID0gZmVhdHVyZV9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZSA9IHJvd1N1bXMoLj4gMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsQWJ1bmRhbmNlID0gdGF4YV9zdW1zKHBzX2dlbnVzKSkgJT4lDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKHByZXZhbGVuY2UgPj0gcHJldmFsZW5jZVRocmVzaG9sZCkgJT4lIA0KICAgICAgICAgICAgICAgICAgIHB1bGwoZmVhdHVyZV9pZCkgJT4lDQogICAgICAgICAgICAgICAgICAgcHJ1bmVfdGF4YSguLCBwc19nZW51cykgJT4lDQogICAgICAgICAgICAgICAgICAgcHJ1bmVfc2FtcGxlcyhzYW1wbGVfc3VtcyguKSA+PSA1MDAsIC4pICU+JSANCiAgICAgICAgICAgICAgICAgICBwcnVuZV90YXhhKHRheGFfc3VtcyguKSA+IDAsIC4pDQogICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhKHBzX2dlbnVzKSA9IHNhbXBsZV9kYXRhKHBzX2dlbnVzKSAlPiUgDQogICAgICAgICAgICAgICAgICAgYXMoJ2RhdGEuZnJhbWUnKSAlPiUNCiAgICAgICAgICAgICAgICAgICBtdXRhdGUoVGlzc3VlVHlwZSA9IGZjdF9yZWxldmVsKFRpc3N1ZVR5cGUsICdPdnVsZScpKQ0KICAgICAgICAgICAgICAgICByZXR1cm4ocHNfZ2VudXMpfSkNCnBzX2dlbnVzX3JhID0gbWFwKHBzX2dlbnVzLCB+dHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoLngsIGZ1bmN0aW9uKHgpe3ggLyBzdW0oeCl9KSkNCnBzX2dlbnVzX2NsciA9IG1hcChwc19nZW51cywgbWljcm9iaW9tZTo6dHJhbnNmb3JtLCAnY2xyJykNCnBzX2dlbnVzX2FsciA9IG1hcChwc19nZW51cywgbWljcm9iaW9tZTo6dHJhbnNmb3JtLCAnYWxyJywgc2hpZnQ9MSkNCnBzX3NwZWNpZXMgPSBtYXAocHNfcGh5bHVtX2ZpbHQsIA0KICAgICAgICAgICAgICAgZnVuY3Rpb24ocHNfcGh5bHVtX2ZpbHQpew0KICAgICAgICAgICAgICAgICBwc19zcGVjaWVzID0gdGF4X2dsb20ocHNfcGh5bHVtX2ZpbHQsICJTcGVjaWVzIiwgTkFybSA9IFRSVUUpDQogICAgICAgICAgICAgICAgIHByZXZhbGVuY2VUaHJlc2hvbGQgPSAgMC4wNSAqIG5zYW1wbGVzKHBzX3NwZWNpZXMpDQogICAgICAgICAgICAgICAgIHBzX3NwZWNpZXMgPSBwc19zcGVjaWVzICU+JSANCiAgICAgICAgICAgICAgICAgICBnZXRfY291bnRzKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShmZWF0dXJlX2lkID0gZmVhdHVyZV9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZSA9IHJvd1N1bXMoLj4gMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsQWJ1bmRhbmNlID0gdGF4YV9zdW1zKHBzX3NwZWNpZXMpKSAlPiUNCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIocHJldmFsZW5jZSA+PSBwcmV2YWxlbmNlVGhyZXNob2xkKSAlPiUgDQogICAgICAgICAgICAgICAgICAgcHVsbChmZWF0dXJlX2lkKSAlPiUNCiAgICAgICAgICAgICAgICAgICBwcnVuZV90YXhhKC4sIHBzX3NwZWNpZXMpICU+JQ0KICAgICAgICAgICAgICAgICAgIHBydW5lX3NhbXBsZXMoc2FtcGxlX3N1bXMoLikgPj0gNTAwLCAuKSAlPiUgDQogICAgICAgICAgICAgICAgICAgcHJ1bmVfdGF4YSh0YXhhX3N1bXMoLikgPiAwLCAuKQ0KICAgICAgICAgICAgICAgICBzYW1wbGVfZGF0YShwc19zcGVjaWVzKSA9IHNhbXBsZV9kYXRhKHBzX3NwZWNpZXMpICU+JSANCiAgICAgICAgICAgICAgICAgICBhcygnZGF0YS5mcmFtZScpICU+JQ0KICAgICAgICAgICAgICAgICAgIG11dGF0ZShUaXNzdWVUeXBlID0gZmN0X3JlbGV2ZWwoVGlzc3VlVHlwZSwgJ092dWxlJykpDQogICAgICAgICAgICAgICAgIHJldHVybihwc19zcGVjaWVzKX0pDQpwc19zcGVjaWVzX3JhID0gbWFwKHBzX3NwZWNpZXMsIH50cmFuc2Zvcm1fc2FtcGxlX2NvdW50cygueCwgZnVuY3Rpb24oeCl7eCAvIHN1bSh4KX0pKQ0KcHNfc3BlY2llc19jbHIgPSBtYXAocHNfc3BlY2llcywgbWljcm9iaW9tZTo6dHJhbnNmb3JtLCAnY2xyJykNCnBzX3NwZWNpZXNfYWxyID0gbWFwKHBzX3NwZWNpZXMsIG1pY3JvYmlvbWU6OnRyYW5zZm9ybSwgJ2FscicsIHNoaWZ0PTEpDQpgYGANCg0KTW9zdCBwcmV2YWxlbnQgZ2VuZXJhDQpgYGB7cn0NCnByZXZfY29ybl9nZW51cyA9IG1hcChwc19nZW51c19yYSwNCiAgICAgICAgICAgIGZ1bmN0aW9uKHBzX2dlbnVzX3JhKXsNCiAgICAgICAgICAgIHJlbGF0aXZlX2NvdW50cyA9IHBzX2dlbnVzX3JhICU+JSBnZXRfY291bnRzKCkNCiAgICAgICAgICAgICAgdGF4ID0gcHNfZ2VudXNfcmEgJT4lIGdldF90YXgoKQ0KICAgICAgICAgICAgICByZWxhdGl2ZV9jb3VudHMgJT4lIA0KICAgICAgICAgICAgICAgIHBpdm90X2xvbmdlcigtZmVhdHVyZV9pZCwgbmFtZXNfdG8gPSAnU2FtcGxlSUQnLCB2YWx1ZXNfdG8gPSAnY291bnRzJykgJT4lDQogICAgICAgICAgICAgICAgbGVmdF9qb2luKG1ldGFkYXRhLCBieT0nU2FtcGxlSUQnKSAlPiUNCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4odGF4LCBieT0nZmVhdHVyZV9pZCcpICU+JQ0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdlbnVzKSAlPiUNCiAgICAgICAgICAgICAgICBtdXRhdGUocHJldmFsZW5jZV9lbnRpcmVfZGF0YXNldCA9IHN1bShjb3VudHMgPiAwKSAvIG4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2VfZW50aXJlX2RhdGFzZXQgPSBtZWFuKGNvdW50cykpICU+JQ0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdlbnVzLCBDb3JuX0dlbm90eXBlKSAlPiUNCiAgICAgICAgICAgICAgICBzdW1tYXJpemUocHJldmFsZW5jZSA9IHN1bShjb3VudHMgPiAwKSAvIG4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2UgPSBtZWFuKGNvdW50cyksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2VfZW50aXJlX2RhdGFzZXQgPSBmaXJzdChwcmV2YWxlbmNlX2VudGlyZV9kYXRhc2V0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2VfZW50aXJlX2RhdGFzZXQgPSBmaXJzdChtZWFuX3JlbGF0aXZlX2FidW5kYW5jZV9lbnRpcmVfZGF0YXNldCkpICU+JQ0KICAgICAgICAgICAgICAgIHVuZ3JvdXAoKX0pDQpwcmV2X2Nvcm5fZ2VudXMkYDE2U2AgJT4lIA0KICByZW5hbWUodG90YWwgPSBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZV9lbnRpcmVfZGF0YXNldCkgJT4lDQogIGRpc3RpbmN0KEdlbnVzLCBDb3JuX0dlbm90eXBlLCBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZSwgdG90YWwpICU+JQ0KICBtdXRhdGUobWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2U9IHJvdW5kKG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlLCAzKSwNCiAgICAgICAgIHRvdGFsID0gcm91bmQodG90YWwsIDMpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IENvcm5fR2Vub3R5cGUsIHZhbHVlc19mcm9tID0gbWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2UpICU+JQ0KICBmaWx0ZXIodG90YWwgPj0gMC4wMSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JQ0KICBrYmwoZm9ybWF0ID0gJ2h0bWwnLCBjb2wubmFtZXMgPSBjKCdHZW51cycsICdUb3RhbCBSZWxhdGl2ZSBBYnVuZGFuY2UnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVsYXRpdmUgYWJ1bmRhbmNlIEI3MycsICdSZWxhdGl2ZSBhYnVuZGFuY2UgQ01MMzIyJykpICU+JQ0KICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGLCBodG1sX2ZvbnQgPSAiVGltZXMgTmV3IFJvbWFuIikNCnByZXZfY29ybl9nZW51cyRJVFMgJT4lIA0KICByZW5hbWUodG90YWwgPSBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZV9lbnRpcmVfZGF0YXNldCkgJT4lDQogIGRpc3RpbmN0KEdlbnVzLCBDb3JuX0dlbm90eXBlLCBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZSwgdG90YWwpICU+JQ0KICBtdXRhdGUobWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2U9IHJvdW5kKG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlLCAzKSwNCiAgICAgICAgIHRvdGFsID0gcm91bmQodG90YWwsIDMpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IENvcm5fR2Vub3R5cGUsIHZhbHVlc19mcm9tID0gbWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2UpICU+JQ0KICAjZmlsdGVyKHRvdGFsID49IDAuMDEpICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWwpKSAlPiUNCiAga2JsKGZvcm1hdCA9ICdodG1sJywgY29sLm5hbWVzID0gYygnR2VudXMnLCAnVG90YWwgUmVsYXRpdmUgQWJ1bmRhbmNlJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlbGF0aXZlIGFidW5kYW5jZSBCNzMnLCAnUmVsYXRpdmUgYWJ1bmRhbmNlIENNTDMyMicpKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIlRpbWVzIE5ldyBSb21hbiIpDQpgYGANCk1vc3QgcHJldmFsZW50IHNwZWNpZXMNCmBgYHtyfQ0KcHJldl9jb3JuX3NwZWNpZXMgPSBtYXAocHNfc3BlY2llc19yYSwNCiAgICAgICAgICAgIGZ1bmN0aW9uKHBzX3NwZWNpZXNfcmEpew0KICAgICAgICAgICAgcmVsYXRpdmVfY291bnRzID0gcHNfc3BlY2llc19yYSAlPiUgZ2V0X2NvdW50cygpDQogICAgICAgICAgICAgIHRheCA9IHBzX3NwZWNpZXNfcmEgJT4lIGdldF90YXgoKQ0KICAgICAgICAgICAgICByZWxhdGl2ZV9jb3VudHMgJT4lIA0KICAgICAgICAgICAgICAgIHBpdm90X2xvbmdlcigtZmVhdHVyZV9pZCwgbmFtZXNfdG8gPSAnU2FtcGxlSUQnLCB2YWx1ZXNfdG8gPSAnY291bnRzJykgJT4lDQogICAgICAgICAgICAgICAgbGVmdF9qb2luKG1ldGFkYXRhLCBieT0nU2FtcGxlSUQnKSAlPiUNCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4odGF4LCBieT0nZmVhdHVyZV9pZCcpICU+JQ0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KFNwZWNpZXMpICU+JQ0KICAgICAgICAgICAgICAgIG11dGF0ZShwcmV2YWxlbmNlX2VudGlyZV9kYXRhc2V0ID0gc3VtKGNvdW50cyA+IDApIC8gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZV9lbnRpcmVfZGF0YXNldCA9IG1lYW4oY291bnRzKSkgJT4lDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoU3BlY2llcywgQ29ybl9HZW5vdHlwZSkgJT4lDQogICAgICAgICAgICAgICAgc3VtbWFyaXplKHByZXZhbGVuY2UgPSBzdW0oY291bnRzID4gMCkgLyBuKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlID0gbWVhbihjb3VudHMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlX2VudGlyZV9kYXRhc2V0ID0gZmlyc3QocHJldmFsZW5jZV9lbnRpcmVfZGF0YXNldCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlX2VudGlyZV9kYXRhc2V0ID0gZmlyc3QobWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2VfZW50aXJlX2RhdGFzZXQpKSAlPiUNCiAgICAgICAgICAgICAgICB1bmdyb3VwKCl9KQ0KcHJldl9jb3JuX3NwZWNpZXMkYDE2U2AgJT4lIA0KICByZW5hbWUodG90YWwgPSBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZV9lbnRpcmVfZGF0YXNldCkgJT4lDQogIGRpc3RpbmN0KFNwZWNpZXMsIENvcm5fR2Vub3R5cGUsIG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlLCB0b3RhbCkgJT4lDQogIG11dGF0ZShtZWFuX3JlbGF0aXZlX2FidW5kYW5jZT0gcm91bmQobWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2UsIDMpLA0KICAgICAgICAgdG90YWwgPSByb3VuZCh0b3RhbCwgMykpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gQ29ybl9HZW5vdHlwZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZSkgJT4lDQogIGZpbHRlcih0b3RhbCA+PSAwLjAxKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsKSkgJT4lDQogIGtibChmb3JtYXQgPSAnaHRtbCcsIGNvbC5uYW1lcyA9IGMoJ1NwZWNpZXMnLCAnVG90YWwgUmVsYXRpdmUgQWJ1bmRhbmNlJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlbGF0aXZlIGFidW5kYW5jZSBCNzMnLCAnUmVsYXRpdmUgYWJ1bmRhbmNlIENNTDMyMicpKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIlRpbWVzIE5ldyBSb21hbiIpDQpwcmV2X2Nvcm5fc3BlY2llcyRJVFMgJT4lIA0KICByZW5hbWUodG90YWwgPSBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZV9lbnRpcmVfZGF0YXNldCkgJT4lDQogIGRpc3RpbmN0KFNwZWNpZXMsIENvcm5fR2Vub3R5cGUsIG1lYW5fcmVsYXRpdmVfYWJ1bmRhbmNlLCB0b3RhbCkgJT4lDQogIG11dGF0ZShtZWFuX3JlbGF0aXZlX2FidW5kYW5jZT0gcm91bmQobWVhbl9yZWxhdGl2ZV9hYnVuZGFuY2UsIDMpLA0KICAgICAgICAgdG90YWwgPSByb3VuZCh0b3RhbCwgMykpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gQ29ybl9HZW5vdHlwZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3JlbGF0aXZlX2FidW5kYW5jZSkgJT4lDQogIGZpbHRlcih0b3RhbCA+PSAwLjAxKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsKSkgJT4lDQogIGtibChmb3JtYXQgPSAnaHRtbCcsIGNvbC5uYW1lcyA9IGMoJ1NwZWNpZXMnLCAnVG90YWwgUmVsYXRpdmUgQWJ1bmRhbmNlJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlbGF0aXZlIGFidW5kYW5jZSBCNzMnLCAnUmVsYXRpdmUgYWJ1bmRhbmNlIENNTDMyMicpKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIlRpbWVzIE5ldyBSb21hbiIpDQpgYGANCmBgYHtyfQ0KcmVhZHMgPSBsaXN0KCcxNlMnID0gcmVhZF9xemEoaGVyZSgnZGF0YScsICcxNlMnLCAncmVwLXNlcXMtZmlsdGVyZWQucXphJykpJGRhdGEsDQogICAgICAgICAgICAgJ0lUUycgPSByZWFkX3F6YShoZXJlKCdkYXRhJywgJ0lUUycsICdyZXAtc2Vxcy1maWx0ZXJlZC5xemEnKSkkZGF0YSkNCmBgYA0KDQpCZWxvdyBhcmUgYmFycGxvdHMgb2YgcmVsYXRpdmUgdGF4b24gYWJ1bmRhbmNlcyBmb3IgMTZTIHNlcXVlbmNpbmcgd2l0aCBzYW1wbGVzIGdyb3VwZWQgYWNjb3JkaW5nIHRvIHNpbWlsYXJpdHkgdXNpbmcgdGhlIG5lYXRtYXAgbWV0aG9kLiANCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMCwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hpZGUnfQ0KIyMgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wYWxldHRlLmpzL2Jsb2IvNzlhNzAzZGYzNDRlM2IyNDM4MGNlMWEyMTFhMmRmN2YyZDkwY2EyMi9wYWxldHRlLmpzI0w4MDINCm1wbjY1ID0gYygnI2ZmMDAyOScsJyMzNzdlYjgnLCcjNjZhNjFlJywnIzk4NGVhMycsJyMwMGQyZDUnLCcjZmY3ZjAwJywnI2FmOGQwMCcsJyM3ZjgwY2QnLCcjYjNlOTAwJywnI2M0MmU2MCcsJyNhNjU2MjgnLA0KICAgICAgICAgJyNmNzgxYmYnLCcjOGRkM2M3JywnI2JlYmFkYScsJyNmYjgwNzInLCcjODBiMWQzJywnI2ZkYjQ2MicsJyNmY2NkZTUnLCcjYmM4MGJkJywnI2ZmZWQ2ZicsJyNjNGVhZmYnLCcjY2Y4YzAwJywNCiAgICAgICAgICcjMWI5ZTc3JywnI2Q5NWYwMicsJyNlNzI5OGEnLCcjZTZhYjAyJywnI2E2NzYxZCcsJyMwMDk3ZmYnLCcjMDBkMDY3JywnIzAwMDAwMCcsJyMyNTI1MjUnLCcjNTI1MjUyJywnIzczNzM3MycsDQogICAgICAgICAnIzk2OTY5NicsJyNiZGJkYmQnLCcjZjQzNjAwJywnIzRiYTkzYicsJyM1Nzc5YmInLCcjOTI3YWNjJywnIzk3ZWUzZicsJyNiZjM5NDcnLCcjOWY1YjAwJywnI2Y0ODc1OCcsJyM4Y2FlZDYnLA0KICAgICAgICAgJyNmMmI5NGYnLCcjZWZmMjZlJywnI2U0Mzg3MicsJyNkOWIxMDAnLCcjOWQ3YTAwJywnIzY5OGNmZicsJyNkOWQ5ZDknLCcjMDBkMjdlJywnI2QwNjgwMCcsJyMwMDlmODInLCcjYzQ5MjAwJywNCiAgICAgICAgICcjY2JlOGZmJywnI2ZlY2RkZicsJyNjMjdlYjYnLCcjOGNkMmNlJywnI2M0YjhkOScsJyNmODgzYjAnLCcjYTQ5MTAwJywnI2Y0ODgwMCcsJyMyN2QwZGYnLCcjYTA0YTliJykNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQptYXAocmFua19uYW1lcyhwc19nZW51cyRgMTZTYClbMjo2XSwgZnVuY3Rpb24odGF4X3Jhbmspew0KICBkZiA9IHBzX2dlbnVzJGAxNlNgICU+JSANCiAgICBzcGVlZHlzZXE6Om11dGF0ZV9zYW1wbGVfZGF0YShjb25kaXRpb24gPSBjb25kaXRpb25fd19yZXApICU+JQ0KICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm0gPSAiY29tcG9zaXRpb25hbCIpICU+JQ0KICAgIGFnZ3JlZ2F0ZV9yYXJlKGxldmVsID0gdGF4X3JhbmssIGRldGVjdGlvbiA9IDAuMDUsIHByZXZhbGVuY2UgPSAwLjA1KSANCiAgcCA9IHBsb3RfY29tcG9zaXRpb24oZGYsIHgubGFiZWw9J2NvbmRpdGlvbicsIG90dS5zb3J0ID0gJ2FidW5kYW5jZScsIHNhbXBsZS5zb3J0PSduZWF0bWFwJykgKw0KICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChuY29sID0gMSkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW1wbjY1KSArDQogIHRoZW1lX21pbmltYWwoKSArIA0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MCwgdmp1c3Q9MC41KSkgKw0KICBsYWJzKHggPSAiU2FtcGxlIGNvbmRpdGlvbiIsDQogICAgICAgeSA9ICJSZWxhdGl2ZSBhYnVuZGFuY2UiLA0KICAgICAgIHRpdGxlID0gZ2x1ZSgiMTZTIFJlbGF0aXZlIGFidW5kYW5jZSBhdCB7dGF4X3Jhbmt9IGxldmVsIiksIA0KICAgICAgIGZpbGwgPSB0YXhfcmFuaykNCiAgICAgcCAlPiUgcGxvdGx5OjpnZ3Bsb3RseSgpDQp9KQ0KYGBgDQoNCg0KPGJyPjxicj48YnI+PGJyPjxicj48YnI+IFRoZSBuZXh0IHR3byBzZXRzIGFyZSBkb25lIHdpdGggSVRTIGNvdW50cyBidXQgbWFkZSB0aGUgc2FtZSB3YXkgYXMgYWJvdmUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCm1hcChyYW5rX25hbWVzKHBzX2dlbnVzJElUUylbMjo2XSwgZnVuY3Rpb24odGF4X3Jhbmspew0KICBkZiA9IHBzX2dlbnVzJElUUyAlPiUgDQogICAgc3BlZWR5c2VxOjptdXRhdGVfc2FtcGxlX2RhdGEoY29uZGl0aW9uID0gY29uZGl0aW9uX3dfcmVwKSAlPiUNCiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtID0gImNvbXBvc2l0aW9uYWwiKSAlPiUNCiAgICBhZ2dyZWdhdGVfcmFyZShsZXZlbCA9IHRheF9yYW5rLCBkZXRlY3Rpb24gPSAwLjA1LCBwcmV2YWxlbmNlID0gMC4wNSkgDQogIHAgPSBwbG90X2NvbXBvc2l0aW9uKGRmLCB4LmxhYmVsPSdjb25kaXRpb24nLCBvdHUuc29ydCA9ICdhYnVuZGFuY2UnLCBzYW1wbGUuc29ydD0nbmVhdG1hcCcpICsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQobmNvbCA9IDEpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1tcG42NSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTAsIHZqdXN0PTAuNSkpICsNCiAgbGFicyh4ID0gIlNhbXBsZSBjb25kaXRpb24iLA0KICAgICAgIHkgPSAiUmVsYXRpdmUgYWJ1bmRhbmNlIiwNCiAgICAgICB0aXRsZSA9IGdsdWUoIklUUyBSZWxhdGl2ZSBhYnVuZGFuY2UgYXQge3RheF9yYW5rfSBsZXZlbCIpLCANCiAgICAgICBmaWxsID0gdGF4X3JhbmspDQogIHAgJT4lIHBsb3RseTo6Z2dwbG90bHkoKQ0KfSkNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OCwgd2FybmluZz1GQUxTRX0NCnBydW5lX3RheGEobmFtZXMoc29ydCh0YXhhX3N1bXMocHNfZ2VudXNfcmEkYDE2U2ApLGRlY3JlYXNpbmcgPSBUUlVFKVsxOjMwXSksIHBzX2dlbnVzX3JhJGAxNlNgKSAlPiUNCiAgc3BlZWR5c2VxOjpwbG90X2hlYXRtYXAobWV0aG9kID0gIk5NRFMiLCBkaXN0YW5jZSA9ICJicmF5Iiwgc2FtcGxlLmxhYmVsID0gJ2NvbmRpdGlvbicsIHRheGEubGFiZWw9J0dlbnVzJykgKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MCwgdmp1c3Q9MC41LCBzaXplID0gMTApLA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSkgKw0KICBsYWJzKHRpdGxlID0gJzE2UyBIZWF0bWFwIG9mIHRvcCAzMCBtb3N0IGFidW5kYW50IGdlbmVyYScpDQpgYGANCg0KPGJyPjxicj48YnI+PGJyPjxicj48YnI+DQoNCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OCwgd2FybmluZz1GQUxTRX0NCnBydW5lX3RheGEobmFtZXMoc29ydCh0YXhhX3N1bXMocHNfZ2VudXNfcmEkSVRTKSxkZWNyZWFzaW5nID0gVFJVRSlbMTozMF0pLCBwc19nZW51c19yYSRJVFMpICU+JQ0KICBzcGVlZHlzZXE6OnBsb3RfaGVhdG1hcChtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBzYW1wbGUubGFiZWwgPSAnY29uZGl0aW9uJywgdGF4YS5sYWJlbD0nR2VudXMnKSArDQogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0wLCB2anVzdD0wLjUsIHNpemUgPSAxMCksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpKSArDQogIGxhYnModGl0bGUgPSAnSVRTIEhlYXRtYXAgb2YgdG9wIDMwIG1vc3QgYWJ1bmRhbnQgZ2VuZXJhJykNCmBgYA0KYGBge3J9DQpzYXZlLmltYWdlKGhlcmUoJ3NyYy8xNl9hbmRfSVRTX2ltcG9ydC5SRGF0YScpKQ0KYGBgDQoNCg==